﻿using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Runtime.Intrinsics.X86;
using System.Text;

namespace est2
{
    internal class class2
    {
        static void Main(string[] args)
        {
            Console.WriteLine("数组");
            #region   知识点一  基本概念
            //数组就是存储一组相同类型数据集合
            //数组分为一维、多维、交错数组
            //一般情况下 一维数组简称为 数组
            #endregion

            #region   知识点二 数组的申明
            //变量类型[] 数组名;//只是申明了一个数组，但是并没有开房（？）
            //变量类型 可以是我们学过的 或 没学过的所有变量类型
            int[] arr1;

            //变量类型[] 数组名=new 变量类型[数组的长度];
            int[] arr2 = new int[2];//这种方式相当于开了2个房间，但是房间里的int值默认为0

            //变量类型[] 数组名 =new 变量类型[数组的长度]{内容1,内容2,内容3.....};
            int[] arr3 = new int[3] { 1, 2, 3 };//数组长度是多少，内容就有多少

            //变量类型[] 数组名 =new 变量类型[]{内容1,内容2,内容3......};
            int[] arr4 = new int[] { 1, 2, 3, 4, 5 };//内容想写多少写多少

            //变量类型[] 数组名 ={内容1,内容2,内容3,......};
            int[] arr5 = { 1, 2, 3, 4, 5 };//想写多少写多少

            bool[] arr6 = { true, false, false };//不一定非要是整型

            #endregion

            #region   知识点三  数组的使用
            //1.数组的长度
            int[] arr7 = { 1, 2, 3, 4, 5 };
            //数组变量名：Length
            Console.WriteLine(arr7.Length);

            //2.获取数组中的元素
            //数组中的 下标和索引 他们是从0开始的
            //通过 索引下标去 获得数组中某一个元素的值时
            //一定注意！！！！！！！
            //不能越界 数组的房间号 是 0到Length-1
            Console.WriteLine(arr7[0]);//1
            Console.WriteLine(arr7[2]);//3 
            Console.WriteLine(arr7[4]);//5

            //3.修改数组中的元素
            arr7[0] = 99;//第0的位置存值
            Console.WriteLine(arr7[0]);//99

            //4.遍历数组  通过循环快速获取数组中每一个元素
            Console.WriteLine("***************************");
            for (int i = 0; i < arr7.Length; i++)//后面会常用
            {
                Console.WriteLine(arr7[i]);
            }

            //5.增加数组元素
            //数组初始化之后不能直接加新元素
            Console.WriteLine("***************************");
            int[] arr8 = new int[6];
            //直接搬家
            for (int i = 0; i < arr7.Length; i++)
            {
                arr8[i] = arr7[i];//搬过来了
            }
            arr7 = arr8;//搬家转移
            for (int i = 0; i < arr7.Length; i++)
            {
                Console.WriteLine(arr7[i]);
            }

            //6.删除数组和元素  
            //数值初始化之后不能直接删除元素
            //搬家原理 
            Console.WriteLine("***************************");
            int[] arr9 = new int[5];
            for (int i = 0; i < arr9.Length; i++)
            {
                arr9[i] = arr7[i];
            }
            arr7 = arr9;
            Console.WriteLine(arr7.Length);
            for (int i = 0; i < arr7.Length; i++)
            {
                Console.WriteLine(arr7[i]);
            }

            //7.查找数组中的元素
            //99 2 3 4 5
            //要查找3这个元素在哪个位置
            //只有通过遍历才能确定 数组中 是否存储了一个目标元素
            int a = 3;
            for (int i = 0; i < arr7.Length; i++)
            {
                if (a == arr7[i])
                {
                    Console.WriteLine("和a相等的元素在{0}这个位置", i);//在2的位置是因为是从0开始数的
                    break;
                }
            }
            #endregion

            //总结：
            //1.概念：同一变量类型的数据集合
            //2.一定要掌握的知识：申明，遍历，增删查改
            //3.所有的变量类型都可以申明为数组
            //4.它是用来批量存储游戏中的同一类型对象的 容器 比如 所有怪物 所有玩家

            #region   作业
            //1.请创建一个一维数组并赋值，让其值与下标一样，长度为100
            //创建另一个数组B，让数组A中的每个元素的值乘以2存入到数组B中
            Console.WriteLine("**********************************");
            int[] array = new int[100];
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = i;
                Console.WriteLine(array[i]);
            }

            int[] array2 = new int[100];
            for (int i = 0; i < array.Length; i++)
            {
                array2[i] = 2 * array[i];
                Console.WriteLine(array2[i]);
            }

            //2.随机（0~100）生成1个长度为10的整数数组
            Console.WriteLine("**********************************");
            int[] array3 = new int[10];
            for (int i = 0; i < array3.Length; i++)
            {
                Random num = new Random();
                array3[i] = num.Next(0, 101);
                Console.WriteLine(array3[i]);
            }

            //3.从一个整数数组中找出最大值、最小值、总合、平均值（可以使用随机数1~100）
            Console.WriteLine("**********************************");
            int[] array4 = new int[10];
            int d = 0, d1 = 100, d2 = 0;
            for (int i = 0; i < array4.Length; i++)
            {
                Random num2 = new Random();
                array4[i] = num2.Next(0, 101);
                if (array4[i] > d)//最大值
                {
                    d = array4[i];
                }
                if (array4[i] < d1)//最小值
                {
                    d1 = array4[i];
                }
                Console.WriteLine(array4[i]);
                d2 += array4[i];
            }
            float Avg = d2 / 10f;
            Console.WriteLine("最大值为{0}，最小值为{1}，总和为{2}，平均数为{3}", d, d1, d2, Avg);

            //4.交换数组中的第一个和最后一个、第二个和倒数第二个，依次类推，把数组进行反转并打印
            Console.WriteLine("**********************************");
            int[] array5 = new int[10];
            Random num3 = new Random();
            for (int i = 0;i < array5.Length; i++)
            {
                array5[i] = num3.Next(0,51);
                Console.WriteLine(array5[i]);
            }
            Console.WriteLine("**********************************");
            //int m = array5[0];
            //array5[0] = array5[array5.Length-1];
            //array5[array5.Length-1] = m;

            //m = array5[1];
            //array5[1] = array5[array5.Length - 1 - 1];
            //array5[array5.Length - 1 - 1] = m;

            //m = array5[2];
            //array5[2] = array5[array5.Length - 1 - 2];
            //array5[array5.Length - 1 - 2] = m;

            //公式总结：
            //int 变量=数组[n]   n是第n+1个房子
            //数组[n]=数组[数组.Length-1-n]   后面这个是倒数第n+1个房子
            //数组[数组.Length-1-n]=m
            //ps:开始的int起到一个暂存库的作用（转换库也行）

            for (int i = 0; i < array5.Length/2; i++)//后面要除2的原因是首尾交换，换一半就行，否则会换回去。
            {
                int m = array5[i];
                array5[i] = array5[array5.Length - 1 - i];
                array5[array5.Length - 1 - i] = m;
            }
            for (int i = 0;i<array5.Length ; i++)
            {
                Console.WriteLine(array5[i]);
            }

            //5.将一个整数数组的每一个元素进行如下的处理：
            //如果元素是正数则将这个位置的元素值加1；
            //如果元素是负数则将这个位置的元素值减1；
            //如果元素是0，则不变
            Console.WriteLine("**********************************");
            int[] array6 =new int[10];
            Random num7 = new Random();
            for (int i = 0;i<array6.Length ; i++)
            {
                array6[i] = num7.Next(-20, 20);
                Console.WriteLine(array6[i]);
                if (array6[i]>0)
                {
                    array6[i] += 1;
                }
                if (array6[i]<0)
                {
                    array6[i] -= 1;
                }
            }
            //运算前的结果↑
            //运算完的结果↓
            Console.WriteLine("**********************************");
            for (int i = 0;i<array6.Length ; i++)
            {
                Console.WriteLine(array6[i]);
            }

            //6.定义一个有10个元素的数组，使用for循环，输入10名同学的数学成绩，将成绩依次
            //存入数组然后分别求出最高分和最低分，并且求出10名同学的数学平均成绩
            int[] array7 =new int[10];
            int numa = 0, numb = 1000, numc = 0;
            for (int i = 0; i < array7.Length; i++)
            {
                Console.WriteLine("请输入学生成绩：");
                string str = Console.ReadLine();
                array7[i] = Convert.ToInt32(str);
                if (array7[i] > numa)
                {
                    numa = array7[i];
                }
                if (array7[i] < numb)
                {
                    numb = array7[i];
                }
                numc+=array7[i];
            }
            int z = numc / array7.Length;
            Console.WriteLine("学生平均成绩为{0}，最高分为{1}，最低分为{2}",z,numa,numb);
            //7.请声明一个string类型的数组（长度为25）（该数组中存储着符号），
            //通过遍历数组的方式取出其中存储的符号打印出以下效果
            Console.OutputEncoding = Encoding.UTF8;
            string[] strs = new string[25];
            //三目运算符
            for (int i = 0;i<strs.Length ; i++)
            {
                strs[i] = i % 2 == 0 ? "▼" : "■";     
            }
            for (int i = 0; i < strs.Length; i++)
            {
                if (i % 5 == 0 && i != 0)
                {
                    Console.WriteLine();//这个打印空符号只起到换行作用
                }
                    Console.Write(strs[i]);
                #endregion
            }   
        }
    }
}
